#include <my_head.h>

int main(int argc, const char *argv[]){
    if(2 != argc){
        printf("Usage : %s pathnames\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    // 创建套接字
    int sockfd = 0;
    if(-1 == (sockfd = socket(AF_UNIX, SOCK_STREAM, 0)))
        ERR_LOG("scoket error");
    // 填充服务器本地结构体
    struct sockaddr_un serveraddr;
    serveraddr.sun_family = AF_UNIX;
    strcpy(serveraddr.sun_path, argv[1]);
    socklen_t serveraddr_len = sizeof(serveraddr);
    // 保证套接字文件不存在
    // int ret = 0;
    // char cmd_buff[128] = {0};
    // struct stat my_test;
    // if(-1 == (ret = stat(argv[1], &my_test))){
    //     if(ENOENT != errno){
    //         ERR_LOG("stat error");
    //     }
    // }else if(0 == ret){
    //     sprintf(cmd_buff, "rm %s", argv[1]);
    //     system(cmd_buff);
    // }
    // 绑定
    if(-1 == bind(sockfd, (struct sockaddr *)&serveraddr, serveraddr_len)){
        printf("errno = %d\n", errno);
        ERR_LOG("bind error");
    }
    // 监听
    if(-1 == listen(sockfd, 5))
        ERR_LOG("listen error");
    
    // 定义结构体 保存客户端的信息
    // 对于TCP本地通信 服务器不保存客户端的结构体 也不影响收发数据
    // 如果服务器需要保存客户端的结构体 需要客户端侧自己填充且bind
    struct sockaddr_un clientaddr;
    socklen_t clientaddr_len = sizeof(clientaddr);

    // 等客户端连接
    int acceptfd = 0;
    char buff[128] = {0};
    int nbytes = 0;
    while(1){
        if(-1 == (acceptfd = accept(sockfd, (struct sockaddr *)&clientaddr, &clientaddr_len)))
            ERR_LOG("accept error");
        printf("客户端[%s]连接到服务器..\n", clientaddr.sun_path);
        // 处理读写
        while(1){
            if(-1 == (nbytes = recv(acceptfd, buff, sizeof(buff), 0))){
                ERR_LOG("recv error");
            }else if(0 == nbytes){
                printf("客户端[%s]断开连接..\n", clientaddr.sun_path);
                break;
            }
            if(!strcmp(buff, "quit")){
                printf("客户端[%s]退出了..\n", clientaddr.sun_path);
                break;
            }
            printf("客户端[%s]发来数据[%s]\n", clientaddr.sun_path, buff);
            // 组装应答消息
            strcat(buff, "--beijing");
            // 给客户端发送应答消息
            if(-1 == send(acceptfd, buff, sizeof(buff), 0))
                ERR_LOG("send error");
        }
        // 关闭套接字
        close(acceptfd);
    }
    // 关闭套接字
    close(sockfd);
    return 0;
}